package com.xinnet.core.validate;

import java.util.regex.Pattern;

/**
 * 对输入值进行校验。这个类不能被继承。
 * 
 * @author wenjianye
 */
public final class ValidatorUtil {

  private ValidatorUtil() {
  }

  /**
   * 校验值是不是null。
   * 
   * @param value
   *        校验的值         
   * @return null的情况 返回true
   */
  public static boolean isNull(Object value) {
    return value == null;
  }

  /**
   * 校验文字列是null文字列/空文字列?
   * 
   * @param value
   *         校验的值   
   * @return 值为null、或文字列的长度为0时，返回true
   */
  public static boolean isNullOrEmpty(String value) {
    return value == null || value.length() == 0;
  }

  public static boolean patternMatches(String pattern, Object value) {

    if (value == null) {
      return false;
    }

    if (!(value instanceof String)) {
      return true;
    }

    return (Pattern.matches(pattern, (String) value));
  }

  /**
   * 数值特定范围。 (包含最大値、最小値)。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param value
   *          校验的值
   * @param min
   *          最小值
   * @param max
   *          最大値
   * @return 最小值 <= T <= 最大値:true
   */
  public static <T extends Comparable<T>>boolean inRange(T value, T min, T max) {
    return value.compareTo(min) >= 0 && value.compareTo(max) <= 0;
  }

  /**
   * 比被比较对象的值是大/小。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param value
   *          check的值
   * @param target
   *          比较对象
   * @return value > target :true
   */
  public static <T extends Comparable<T>>boolean moreThan(T value, T target) {
    return value.compareTo(target) > 0;
  }

  /**
   * 值=比较对象的值/ 值>比较对象的值 。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param value
   *          check的值
   * @param target
   *          比较对象
   * @return 值=比较对象的值/值>比较对象的值： true
   */
  public static <T extends Comparable<T>>boolean moreThanOrEquals(T value, T target) {
    return value.compareTo(target) >= 0;
  }

  /**
   * 值<比较对象的值。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param value
   *          check的値
   * @param target
   *          比较对象
   * @return 值<比较对象:true
   */
  public static <T extends Comparable<T>>boolean lessThan(T value, T target) {
    return value.compareTo(target) < 0;
  }

  /**
   * 值=比较对象的值/ 值<比较对象的值。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param value
   *          check的値
   * @param target
   *          比较对象
   * @return 值=比较对象的值/ 值<比较对象的值：true
   */
  public static <T extends Comparable<T>>boolean lessThanOrEquals(T value, T target) {
    return value.compareTo(target) <= 0;
  }

  /**
   * 文字列的长度<=最大长度？。
   * 
   * @param value
   *          check的値
   * @param maxLength
   *          最大长度
   * @return 文字列长度<=最大长度:true
   */
  public static boolean withinLength(String value, int maxLength) {
    return value.length() <= maxLength;
  }

  /**
   * 文字列是否匹配正则表达式？。
   * 
   * @param value
   *          CHECK 对象文字列
   * @param pattern
   *          正则表达式的文字列
   * @return 匹配:true
   */
  public static boolean matchesWith(String value, String pattern) {
    return Pattern.matches(pattern, value);
  }

  /**
   * 日期大小关系比较。 这个方法和lessThanOrEquals()と同じ実装です。
   * 
   * @param <T>
   *          比较可能的类型(Comparable<T>)
   * @param from
   *          开始日期
   * @param to
   *          终了日期
   * @return from ≦ to：true
   */
  public static <T extends Comparable<T>>boolean isCorrectOrder(T from, T to) {
    return lessThanOrEquals(from, to);
  }

}
